#include <head.h>

// 消费者和生产者

// 产品
#define MAX 10

char product[MAX]; // 产品
int product_len;   // 产品数量

pthread_mutex_t mutex; // 互斥锁

void *func_producer(void *val);   // 生产者
void *func_consumer_1(void *val); // 消费者1
void *func_consumer_2(void *val); // 消费者2

int main(int argc, char const *argv[])
{
    // 创建线程号
    pthread_t Tid[3];

    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

    // 初始化产品数量
    product_len = -1;

    // 创建线程
    pthread_create(&Tid[0], NULL, func_producer, NULL);
    pthread_create(&Tid[1], NULL, func_consumer_1, NULL);
    pthread_create(&Tid[2], NULL, func_consumer_2, NULL);

    // 回收线程
    for (size_t i = 0; i < 3; i++)
        pthread_join(Tid[i], NULL);

    // 销毁锁
    pthread_mutex_destroy(&mutex);
    return 0;
}

void *func_producer(void *val) // 生产者
{
    // 产品集合
    char buf[128] = "student@student-machine:~/HQYJ_24072/HQYJ_24072_04";
    int buf_i = 0;
    while (1)
    {
        if (product_len < MAX)
        {
            pthread_mutex_lock(&mutex); // 上锁

            // 生产
            product[product_len] = buf[buf_i];
            buf_i++;
            product[product_len + 1] = '\0';
            product_len++;
            printf("生产完成 产品数量 %d 产品 %c\n", product_len + 1 , product[product_len - 1]);
            pthread_mutex_unlock(&mutex); // 解锁
            sleep(1); // 等待消费
        }
    }
}
// 消费者1
void *func_consumer_1(void *val) // 消费者1
{
    while (1)
    {
        pthread_mutex_lock(&mutex); // 上锁
        if (product_len <= -1)
        {
            pthread_mutex_unlock(&mutex); // 解锁
            sleep(1); // 解锁CD时间
            continue;
        }
        // 消费
        product_len--;
        printf("消费者1 消费完成 产品数量 %d 产品 %c\n", product_len + 1 , product[product_len]);
        sleep(2); // 模拟消费

        pthread_mutex_unlock(&mutex); // 解锁
        sleep(6); // 消费CD时间
    }
}
// 消费者1
void *func_consumer_2(void *val) // 消费者2
{
    while (1)
    {
        pthread_mutex_lock(&mutex); // 上锁
        if (product_len <= -1)
        {
            pthread_mutex_unlock(&mutex); // 解锁
            sleep(1); // 解锁CD时间
            continue;
        }

        // 消费
        product_len--;
        printf("消费者2 消费完成 产品数量 %d 产品 %c\n", product_len + 1 , product[product_len]);
        sleep(1); // 模拟消费

        pthread_mutex_unlock(&mutex); // 解锁
        sleep(6); // 消费CD时间
    }
}
